home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / graphics / vlapak1.zip / MODINFO.ZIP / MIXPLAY.ASM < prev    next >
Assembly Source File  |  1993-04-16  |  5KB  |  270 lines

  1.       DOSSEG
  2.       .MODEL SMALL
  3.       .STACK 200h
  4.       .CODE
  5.       .386
  6.       ASSUME CS:@CODE, DS:@CODE
  7.       Ideal
  8.  
  9. ────────────────────────────────────────────────────────
  10.  
  11. OldInt  dd  ?
  12.  
  13. BaseAddress dw 220h
  14.  
  15. MixedSeg  dw  ?
  16. SampleSeg dw  ?
  17. SampleOff dw  0
  18.  
  19. FileName  db  "jamhot.sam",0   ;you need to put your filename here...
  20. SamLength dw  ?
  21.  
  22. ────────────────────────────────────────────────────────
  23.       
  24. PROC TurnOffSpeaker NEAR
  25.     mov     al,0d3h         ;turn off speaker
  26.     call    Sendcommand
  27.     ret
  28. ENDP TurnOffSpeaker
  29.  
  30.     ;al = command
  31. PROC SendCommand NEAR
  32.     push    dx
  33.     push    ax
  34.     mov     dx,[cs:BaseAddress]
  35.     add     dx,0ch
  36. sendcommandloop:
  37.     in      al,dx
  38.     or      al,al
  39.     js      sendcommandloop
  40.     pop     ax
  41.     out     dx,al
  42.     pop     dx
  43.     ret
  44. ENDP SendCommand
  45.  
  46. PROC TurnOnSpeaker NEAR
  47.     mov     al,0d1h
  48.     call    SendCommand
  49.     ret
  50. ENDP TurnOnSpeaker
  51.  
  52.     ;input- none 
  53.     ;output al=0 successful
  54.     ;       al=1 unsuccessful
  55.     ;Destroys AX,DX,CX
  56.     ;
  57. PROC DspReset NEAR
  58.     mov     dx,[cs:baseaddress]
  59.     add     dx,06h
  60.     mov     al,1
  61.     out     dx,al
  62.     mov     cx,1000
  63.     push    di
  64.     rep     lodsb         ;wait for at least 3µS
  65.     pop     di
  66.     xor     al,al
  67.     out     dx,al
  68.  
  69.     add     dx,8          ;check status (22eh)
  70.     mov     cx,12000
  71. waitforstat:
  72.     in      al,dx
  73.     dec     cx
  74.     je      errorstat
  75.     or      al,al
  76.     js      WaitForStat
  77.  
  78.     mov     cx,10000
  79.     sub     dx,4          ;(22ah)      
  80. waitforstat2:
  81.     in      al,dx
  82.     dec     cx
  83.     je      errorstat
  84.     cmp     al,0aah
  85.     jne     waitforstat2
  86.     mov     al,0
  87.     ret
  88. errorstat:
  89.     mov     al,1
  90.     ret
  91. ENDP DspReset
  92.  
  93. PROC SetUpInterrupt NEAR
  94.     pusha
  95.     push    ds
  96.  
  97.     mov   ax,0
  98.     mov   ds,ax
  99.     mov   bx,8*4                  ;interrupt 8
  100.     mov   ax,[ds:bx]
  101.     mov   [Word LOW  cs:OldInt],ax
  102.     mov   ax,[ds:bx+2]
  103.     mov   [Word HIGH cs:OldInt],ax
  104.  
  105.     cli
  106.     mov   [Word ds:bx],offset TimerInt
  107.     mov   [ds:bx+2],cs
  108.  
  109.     mov   al,36h
  110.     out   43h,al                  ; timer program
  111.  
  112.     mov   ax,1193180/8000         ; # of ticks between interrupts
  113.                                   ; Clock Freq / HZ
  114.     out   40h,al
  115.     mov   al,ah
  116.     out   40h,al
  117.     sti
  118.  
  119.     pop     ds
  120.     popa
  121.     ret
  122. ENDP SetUpInterrupt
  123.   
  124. PROC RemoveInterrupt NEAR
  125.     pusha
  126.     push    ds
  127.     
  128.     cli
  129.     mov ax,0
  130.     mov ds,ax
  131.     mov bx,8*4
  132.     mov ax,[Word cs:OldInt]
  133.     mov [ds:bx],ax
  134.     mov ax,[Word cs:OldInt+2]
  135.     mov [ds:bx+2],ax
  136.     mov al,36h
  137.     out 43h,al
  138.     xor al,al
  139.     out 40h,al
  140.     out 40h,al
  141.     sti
  142.     
  143.     pop     ds
  144.     popa
  145.     ret
  146. ENDP  RemoveInterrupt
  147.  
  148. PROC TimerInt FAR
  149.     pusha
  150.     push    fs
  151.     
  152.     mov     fs,[cs:SampleSeg]
  153.     mov     di,[cs:SampleOff]
  154.     
  155.     mov     al,10h + 0b            ;Direct 8-bit DAC command
  156.     call    SendCommand
  157.  
  158.     mov     al,[fs:di]
  159.     add     al,128            ;change SAM data (-128 to 127) to SB data 0-255
  160.     call    SendCommand
  161.     
  162.     inc     [cs:SampleOff]
  163.     mov     ax,[CS:SamLength]
  164.     cmp     [cs:SampleOff],ax
  165.     jb      @@NotOver
  166.     mov     [cs:SampleOff],0
  167.  
  168. @@NotOver:
  169.     mov     al,20h      ;acknowledge hardware interrupt
  170.     out     20h,al
  171.  
  172.     pop     fs
  173.     popa
  174.     iret
  175. ENDP TimerInt
  176.  
  177.   ; returns -1 if load not successful
  178. PROC  LoadSample NEAR
  179.     pusha
  180.     push    ds
  181.  
  182.     mov     ax,cs
  183.     mov     ds,ax
  184.     mov     dx,offset FileName
  185.     mov     ax,3D00h        ;open the file
  186.     int     21h
  187.     jc      @@Error
  188.  
  189.     mov     bx,ax
  190.     xor     dx,dx             ;load at offset 0
  191.     mov     cx,0ffffh         ;read in a whole segments worth
  192.     mov     ds,[cs:SampleSeg]
  193.     mov     ax,3F00h          ; Load in the sample
  194.     int     21h
  195.  
  196.     mov     [cs:SamLength],ax
  197.  
  198.     mov     ax,3E00h          ;close the file
  199.     int     21h
  200.  
  201.     ;*******  HERE'S THE PART WHERE THE SAMPLES ARE MIXED ! *******
  202.     push    es
  203.     mov     es,[cs:MixedSeg]
  204.     mov     cx,[cs:SamLength]
  205.     mov     bp,cx
  206.  
  207.     mov     di,1500
  208.     mov     si,0
  209. MixLoop:
  210.     
  211.     mov     al,[ds:si]
  212.     sar     al,1        ;divide by 2, cause we're mixing 2 samples together
  213.     mov     [es:si],al
  214.  
  215.     mov     al,[ds:di]
  216.     sar     al,1
  217.     add     [es:si],al
  218.  
  219.     inc     si
  220.     inc     di
  221.     cmp     di,bp
  222.     jb      NotExceeded
  223.     mov     di,0
  224. NotExceeded:
  225.     loop    MixLoop
  226.  
  227.     mov     [cs:SampleSeg],es
  228.  
  229.     pop     es
  230.     pop     ds
  231.     popa
  232.     xor     ax,ax
  233.     ret
  234.  
  235. @@Error:
  236.     pop     ds
  237.     popa
  238.     mov     ax,-1
  239.     ret
  240. ENDP  LoadSample
  241.  
  242. ────────────────────────────────────────────────────────────────────────────
  243.  
  244. START:
  245.     mov   bx,ss
  246.     add   bx,20h            ;put sample right after stack
  247.     mov   [cs:SampleSeg],bx
  248.     add   bx,1000h
  249.     mov   [cs:MixedSeg],bx
  250.  
  251.     call  LoadSample
  252.     or    al,al
  253.     jne   ByeBye
  254.  
  255.     call  DspReset
  256.     call  TurnOnSpeaker
  257.     call  SetUpInterrupt    ;starts going after this line
  258.  
  259.     mov   ah,0
  260.     int   16h               ;wait for a keypress
  261.     
  262.     call  RemoveInterrupt
  263.     call  TurnOffSpeaker
  264.  
  265. ByeBye:    
  266.     mov   ax,4c00h
  267.     int   21h
  268.  
  269. END START
  270.